/**
 *	@file	pgear_act.h
 *	@brief	ポケギア　アクター
 *	@author	Miyuki Iwasawa
 *	@date	07.06.28
 */

#ifndef __H_PGEAR_ACT_H__
#define __H_PGEAR_ACT_H__

typedef enum{
 PGSYSOAM_CGXOFS_AUTO,
 PGSYSOAM_CGXOFS_AREA,
 PGSYSOAM_CGXOFS_ADJUST,
}PGSYSOAM_CGXOFS;

typedef enum{
 PGSYSOAM_VT_MAIN,	//メイン画面に描画
 PGSYSOAM_VT_SUB,	//サブ画面に描画
}PGSYSOAM_VRAMTYPE;

typedef struct _PGEAR_ACT_WORK	PGEAR_ACT_WORK;
typedef void (*PGEAR_ACT_FUNC)(void* wk,PGEAR_ACT_WORK* awork);
struct _PGEAR_ACT_WORK{
	u8	active;
	u8	view_f;	///<バニッシュフラグとは連動していません
	u16	automv_fook;	//このフラグがOnの場合、AllPosUpdateなどの操作から外れる
	_POSITION	pos;
	s16	ex,ey;
	u16	gx,gz;

	fx32	x,y;
	fx32	dx,dy;	//座標移動差分
	CLACT_WORK_PTR	act;
	PGEAR_ACT_FUNC	pFunc;
};

///アクターワークマネージャ構造体
typedef struct _PGEAR_ACTWORK_MAN{
	u16	aNum;	///<配列サイズ数
	u16	actNum;	///<稼動ワーク個数

	PGEAR_ACT_WORK* pList;	///<稼動ワークリスト
	PGEAR_ACT_WORK* pAct;	///<ワーク配列
}PGEAR_ACTWORK_MAN;

/*
 *	@brief	ポケギア　アクターシステム初期化
 */
extern void PGear_ActorSysInit(PGEAR_SYS_WORK *wk);
/*
 *	@brief	ポケギア　アクターシステム開放
 */
extern void PGear_ActorSysRelease(PGEAR_SYS_WORK *wk);
/*
 *	@brief	ポケギア　アクターリソースセット初期化
 */
extern void PGear_ActorResInit(PGEAR_SYS_WORK *wk,u8 mode);
/*
 *	@brief	ポケギア　アクターリソースセット開放
 */
extern void PGear_ActorResRelease(PGEAR_SYS_WORK *wk);

/*
 *	@brief	ポケギア　アクター描画メイン
 */
extern void PGear_ActorMain(PGEAR_SYS_WORK *wk);
/*
 *	@brief	ポケギア　アクター転送メイン
 */
extern void PGear_ActorTrans(PGEAR_SYS_WORK* wk);

/**
 *	@brief	ポケギア　システムOAM リソースマネージャ初期化
 *
 *	@param	heapID	ヒープID
 *	@param	actmax	確保するセルアクター領域の個数
 *	@param	palmax	システム用に占有するOBJパレットの本数
 *	@param	skin	初期スキンナンバー
 *	@param	vramType	描画画面指定(PORUOAM_DRAW_MAIN/SUB/BOTH)
 *  @param	cgx_transofs	キャラクタ転送オフセット指定
 *							(PORUOAM_CGXOFS_AREAを指定した場合、空き領域検索モードになる)
 */
extern PGSYS_OAM_MAN* PGSysOam_Init(int heapID,u16 actmax,u16 palmax,u8 skin,
		u16 vramType,PGSYSOAM_CGXOFS cgx_transofs);

/**
 *	@brief	ポケギア　システムアクター　マネージャ解放
 */
extern void PGSysOam_Release(PGSYS_OAM_MAN* wk);

/*
 *	@brief	ポケギア　システムアクター　リソース読み替え
 */
extern void PGSysOam_ResChange(PGSYS_OAM_MAN* wk,u8 skin);

/**
 *	@brief	ポケギア　システムアクター　描画
 */
extern void PGSysOam_Draw(PGSYS_OAM_MAN* wk);

/**
 *	@brief	ポケギア　システムアクター　作成
 */
extern CATS_ACT_PTR PGSysOam_ObjAdd(PGSYS_OAM_MAN* wk,
	u16 x,u16 y,u16 z,u8 bg_pri,u8 spri,u8 idx,u8 anmID,PGSYSOAM_VRAMTYPE type);

/**
 *	@brief	ポケギア　システムアクター　削除
 */
extern void PGSysOam_ObjDelete(CATS_ACT_PTR oam);

/**
 *	@brief	ポケギア　アクターワークマネージャ作成
 *
 *	@param	num	ワーク確保数
 *	@param	heapID	メモリ確保に使用するheapID
 *
 */
extern PGEAR_ACTWORK_MAN* PGActWorkMan_Create(u16 num,int heapID);

/**
 *	@brief	ポケギア　アクターワークマネージャ開放
 */
extern void PGActWorkMan_Release(PGEAR_ACTWORK_MAN* wk);

/**
 *	@brief	アクターワークマネージャ　動作メイン
 */
extern void PGActWorkMan_Main(PGEAR_ACTWORK_MAN* wk);
/**
 *	@brief	アクターワークマネージャ　登録OBJのpos座標を一挙に反映させる
 */
extern void PGActWorkMan_AllPosUpdate(PGEAR_ACTWORK_MAN* wk);

/**
 *	@brief	アクターワークマネージャ　OBJ登録
 */
extern u16 PGActWorkMan_ListAdd(PGEAR_ACTWORK_MAN* wk,CLACT_WORK_PTR pAct);

/**
 *	@brief	アクターワークマネージャ　リストに登録されたOBJをまとめて開放
 *
 *	＊セルアクター自体も開放する
 */
extern void PGActWorkMan_ListDelAll(PGEAR_ACTWORK_MAN* wk);

/*
 *	@brief	アクターワークマネージャ　指定indexから後ろに登録されたOBJを開放する
 *	＊セルアクター自体も開放する
 */
extern void PGActWorkMan_ListDelIdxAfter(PGEAR_ACTWORK_MAN* wk,u8 idx);

/**
 *	@brief	アクターワーク　動作関数セット
 */
extern void PGActWork_FuncSet(PGEAR_ACTWORK_MAN* wk,u16 idx,PGEAR_ACT_FUNC func);


//--------------------------------------------------------------
/**
 * @brief	ポジションセット
 */
//--------------------------------------------------------------
static inline void PGActWork_PosSet(PGEAR_ACT_WORK* wk,s16 x,s16 y)
{
	wk->pos.x = x;
	wk->pos.y = y;
}
//--------------------------------------------------------------
/**
 * @brief	ポジションの差分セット
 */
//--------------------------------------------------------------
static inline void PGActWork_PosMove(PGEAR_ACT_WORK* wk,s16 dx,s16 dy)
{
	wk->pos.x += dx;
	wk->pos.y += dy;
}

//--------------------------------------------------------------
/**
 * @brief	ブロックポジションのセット
 */
//--------------------------------------------------------------
static inline void PGActWork_GridPosSet(PGEAR_ACT_WORK* wk,s16 gx,s16 gz)
{
	wk->gx = gx;
	wk->gz = gz;
}

//--------------------------------------------------------------
/**
 * @brief	ポジションのセット(fx32)
 */
//--------------------------------------------------------------
static inline void PGActWork_PosSetEx(PGEAR_ACT_WORK* wk,s16 x,s16 y)
{
	wk->x = FX32_CONST(x);
	wk->y = FX32_CONST(y);
}

//--------------------------------------------------------------
/**
 * @brief	ポジションをアクター実体に反映
 */
//--------------------------------------------------------------
static inline void PGActWork_PosUpdate(PGEAR_ACT_WORK* wk,s16 x,s16 y)
{
	CATS_ObjectPosSet(wk->act,wk->pos.x,wk->pos.y);
}

//--------------------------------------------------------------
/**
 * @brief	ポジションをワークとアクター実体に双方に反映
 */
//--------------------------------------------------------------
static inline void PGActWork_PosSetUpdate(PGEAR_ACT_WORK* wk,s16 x,s16 y)
{
	wk->pos.x = x;
	wk->pos.y = y;
	CATS_ObjectPosSet(wk->act,wk->pos.x,wk->pos.y);
}

/*
 *	@brief	ソフトウェアプライオリティセット
 */
static inline void PGActWork_SPriSet(PGEAR_ACT_WORK* wk,int pri)
{
	CATS_ObjectPriSet(wk->act, pri);
}

//--------------------------------------------------------------
/**
 * @brief	view_fのセット
 */
//--------------------------------------------------------------
static inline void PGActWork_ViewSet(PGEAR_ACT_WORK* wk,BOOL set)
{
	wk->view_f = set;
}

#endif	//__H_PGEAR_ACT_H__

